外观
2023年12月 GESP C++ 二级真题解析
一、单选题 (每题2分,共30分)
单选题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | C | A | D | D | D | A | D | C | D | B | C | D | C | B | B |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 以下不可以做为C++变量的是()。
A. FiveStar B. fiveStar C. 5Star D. Star5
查看解析
答案:C
考纲知识点: 变量的定义与使用
解析: C++的标识符(包括变量名)命名规则规定:标识符可以由字母、数字和下划线组成,但必须以字母或下划线开头,不能以数字开头。选项C 5Star 以数字开头,所以是错误的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 在C++中,与for(int i = 10; i < 20; i += 2) cout << i;输出结果相同的是()。
A. for(int i = 10; i < 19; i += 2) cout << i; B. for(int i = 11; i < 19; i += 2) cout << i; C. for(int i = 10; i < 21; i += 2) cout << i; D. 以上均不对
查看解析
答案:A
考纲知识点: 循环结构
解析: 原始循环的条件是 i < 20,步长为2,i的取值会是10, 12, 14, 16, 18。 A. i < 19,i的取值同样是10, 12, 14, 16, 18。输出相同。 B. i从11开始,不正确。 C. i < 21,i的取值会多一个20,不正确。 因此,A选项与原循环等价。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 以下C++代码实现从小到大的顺序输出能整除N的数(N的因子),例如N=18时输出1 2 3 6 9 18,横线处应填入()。
cpp
cin >> N;
for(________)
if(N % i == 0)
cout << i << " ";1
2
3
4
2
3
4
A. int i = 0; i < N; i++ B. int i = 1; i < N; i++ C. int i = 0; i < N + 1; i++ D. int i = 1; i < N + 1; i++
查看解析
答案:D
考纲知识点: 循环结构、基本运算
解析: 程序的目的是找到并输出N的所有因子。因子需要从1开始遍历,并且要包括N本身。 A和C从0开始遍历,会导致 N % 0 的错误。 B的循环条件是 i < N,不包括N本身,所以会漏掉N这个因子。 D的循环条件是 i < N + 1 (等价于 i <= N),从1遍历到N,能正确找到所有因子。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 下面C++代码用于判断输入的整数是否为对称数,如1221、12321是对称数,但123、972不是对称数。下面对该题对应代码的说法,正确的是()。
cpp
1 cin >> N;
2 newNum = 0;
3 orgNum = N; // 保存原始N的值
4 while(N){
5 newNum = newNum * 10 + N % 10;
6 N = N / 10;
7 }
8 if(newNum == orgNum)
9 cout << N << "为对称数";1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
A. 代码没有语法错误,如果N为对称数,第8行将能正确输出。 B. 代码没有语法错误,但如果N为负数,将导致死循环。 C. 代码存在语法错误,程序不能被执行。 D. 代码没有语法错误,但不能达到预期目标,因为循环结束N总为0。
查看解析
答案:D
考纲知识点: 程序模拟、问题分解
解析: 这段代码的逻辑是通过循环将原数N反转存入newNum。问题在于,while循环结束后,N的值已经变为0。所以在第8行 if(newNum == N) 时,是在用反转后的数和0比较,这显然是不对的。为了正确判断,应该在循环开始前用另一个变量(如 orgNum)保存N的原始值,最后用 newNum 和 orgNum 进行比较。因此,该代码不能达到预期目标。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 下面C++代码用于判断N(大于等于2的正整数)是否为质数(素数)。下面对如下代码的说法,正确的是()。
cpp
1 cin >> N;
2 for(i = 2; i < N / 2; i++)
3 if(N % i == 0) {
4 cout << N << "不是质数";
5 break;
6 }
7 if (i >= N / 2)
8 cout << N << " 是质数";1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
A. 代码能正确判断N是否为质数。 B. 代码总是不能判断N是否质数。 C. 删除第5行break,将能正确判断N是否质数。 D. 代码存在漏洞,边界存在问题,应将第2行和第7行的N/2改为sqrt(N)或进行其他优化,并且对于小的N(如2,3,4)判断会出错。
查看解析
答案:D
考纲知识点: 循环结构、素数判断
解析: 这段代码存在几个问题:
- 循环条件不优:判断质数只需要检查到
sqrt(N)即可,N/2会做很多不必要的检查。 - 逻辑漏洞:当输入是2或3时,
for循环条件i < N/2(即2<1或2<1.5)不满足,循环不执行,i的值仍然是2。然后执行到第7行if(i >= N/2)(即2>=1或2>=1.5),条件成立,会错误地输出“是质数”。但当输入4时,循环i=2; i<2;不执行,i为2,if(2>=2)成立,错误输出“是质数”。所以该代码对很多数都无法正确判断。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 下面C++代码执行后的输出是()。
cpp
#include <iostream>
using namespace std;
int main() {
int N = 4;
for(int i = 0; i < N; i++) {
for(int j = 1; j < i; j++) {
if(i * j % 2 == 0) {
cout << i << "#" << j << "#";
continue;
}
}
cout << "0";
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A. 2#1#03#1#3#2#00 B. 2#1#03#2#00 C. 1#0#2#1#0 D. 02#1#03#1#3#2#0
查看解析
答案:A
考纲知识点: 循环嵌套、程序模拟
解析: 我们来跟踪循环:
- i = 0: 内循环
j < 0不执行。输出0。 - i = 1: 内循环
j < 1不执行。输出0。 - i = 2: 内循环开始。
- j = 1:
i*j是 2,2%2==0为真。输出2#1#。continue跳过内循环的剩余部分。 输出0(外循环)。
- j = 1:
- i = 3: 内循环开始。
- j = 1:
i*j是 3,3%2==0为假。 - j = 2:
i*j是 6,6%2==0为真。输出3#2#。continue。 输出0(外循环)。
- j = 1:
最终输出是 002#1#03#2#0。 选项中没有完全匹配的,但A选项2#1#03#1#3#2#00最接近,可能是题目或选项印刷有误。根据代码逻辑,当i=3, j=1时,3*1%2 != 0,不会输出。因此最符合代码逻辑的输出是002#1#03#2#0。给出的答案A似乎是错误的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 下面C++代码执行后的输出是()。
cpp
#include <iostream>
using namespace std;
int main() {
int cnt = 0;
for(int i = 1; i < 10; i++) {
int j;
for(j = 1; j < i; j += 2) {
if (i * j % 2 == 0) {
cnt++;
break;
}
}
if(j >= i) {
cout << cnt << "#";
}
}
cout << cnt;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
A. 0 B. 8#8 C. 4 D. 4#4
查看解析
答案:D
考纲知识点: 循环嵌套、程序模拟
解析:
- 外层循环
i从1到9。 - 内层循环
j从1开始,步长为2,检查i*j是否为偶数。 - 如果
i*j是偶数,cnt增加,并跳出内层循环。 if(j >= i)这个条件只有当内层循环正常结束(即没有break)时才会满足。i为奇数时,j也总是奇数,i*j是奇数,内循环总能正常结束,j最终会大于等于i。i为偶数时,j是奇数,i*j是偶数,内层循环第一次就break,cnt加1,j此时为1,j<i,if(j>=i)不满足。
我们来模拟:
- i=1: 内循环不执行,j=1, j>=i, 输出 cnt(0), "#"。
cnt=0 - i=2: j=1, 2*1%2==0, cnt=1, break。
j=1<2, 不输出#。cnt=1 - i=3: j=1, 3*1%2!=0。j=3。循环结束。j>=i, 输出 cnt(1), "#"。
cnt=1 - i=4: j=1, 4*1%2==0, cnt=2, break。
j=1<4, 不输出#。cnt=2 - i=5: j=1,3,5。循环结束。j>=i, 输出 cnt(2), "#"。
cnt=2 - i=6: j=1, 6*1%2==0, cnt=3, break。
j=1<6, 不输出#。cnt=3 - i=7: j=1,3,5,7。循环结束。j>=i, 输出 cnt(3), "#"。
cnt=3 - i=8: j=1, 8*1%2==0, cnt=4, break。
j=1<8, 不输出#。cnt=4 - i=9: j=1..9。循环结束。j>=i, 输出 cnt(4), "#"。
cnt=4
最终cout << cnt时,cnt为4。 输出是 0#1#2#3#4#4。选项D 4#4 最为接近,可能题目有误或对if(j>=i)的理解不同。如果if(j>=i)是在外循环结束后判断,则输出是4。如果if(j>=i) cout << cnt << "#";是想在i=9时输出,那么就是 4#,最后再输出一个4,得到4#4。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 下面C++代码执行后的输出是()。
cpp
#include <iostream>
using namespace std;
int main() {
int N = 100;
while (N > 0) {
if (N % 2) { // 如果N是奇数
break;
} else if (N % 3 == 0) {
N -= 5;
} else {
N -= 20;
}
}
cout << N;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
A. 100 B. 95 C. 55 D. 0
查看解析
答案:C
考纲知识点: 循环与选择结构
解析:
- N = 100: 偶数,不是3的倍数。
N -= 20->N = 80。 - N = 80: 偶数,不是3的倍数。
N -= 20->N = 60。 - N = 60: 偶数,是3的倍数。
N -= 5->N = 55。 - N = 55: 奇数。
break,循环终止。 - 输出
N的值,即55。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 下面C++代码执行后的输出是()。
cpp
#include <iostream>
using namespace std;
int main() {
int x = 1;
while (x < 100) {
if (x % 3 != 0) {
cout << x << ",";
} else if (x / 10) { // 如果x是两位数或以上
break;
} else {
x += 5;
}
x += 2;
}
cout << x;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A. 1, B. 1,3, C. 1,5,17, D. 1,10,12,
查看解析
答案:D
考纲知识点: 循环与选择结构
解析:
- x = 1:
1%3!=0,输出1,。x+=2->x=3。 - x = 3:
3%3==0。x/10为0 (不是两位数)。x+=5->x=8。x+=2->x=10。 - x = 10:
10%3!=0,输出10,。x+=2->x=12。 - x = 12:
12%3==0。12/10为1 (是两位数)。break,循环终止。 - 最后输出
x的值,即12。 - 总输出:
1,10,12。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 下面C++代码执行后的输出是()。
cpp
#include <iostream>
using namespace std;
int main() {
int cnt = 0;
for (int i = 0; i < 5; i++) {
for(int j = 0; j < i; j++) {
cnt++;
}
}
cout << cnt;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
A. 5 B. 10 C. 20 D. 30
查看解析
答案:B
考纲知识点: 循环嵌套
解析:cnt的值是内层循环执行的总次数。
- i = 0: 内循环执行0次。
- i = 1: 内循环执行1次。
- i = 2: 内循环执行2次。
- i = 3: 内循环执行3次。
- i = 4: 内循环执行4次。 总次数 =
0 + 1 + 2 + 3 + 4 = 10。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 以下C++代码用于输出1-100(含)的整数平方数(完全平方数),如16是4的平方,横线处应填写()。
cpp
#include <iostream>
#include <cmath>
using namespace std;
int main() {
for (int i = 1; i < 100 + 1; i++) {
if(________) {
cout << i << " ";
}
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
A. int(sqrt(i)) * int(sqrt(i)) = i B. int(sqrt(i)) == sqrt(i) C. int(sqrt(i)) * int(sqrt(i)) == i D. int(sqrt(i)) = sqrt(i)
查看解析
答案:C
考纲知识点: 标准库函数、条件判断
解析: 一个数i是完全平方数,意味着它的平方根是一个整数。 A和D是赋值语句,不能用于if判断。 B的思路是判断sqrt(i)取整后是否还等于原来的sqrt(i),这在逻辑上是可行的,但由于浮点数精度问题,不推荐直接用==比较。 C的思路是,先求sqrt(i)并取整,得到一个整数,然后把这个整数平方,看结果是否还等于i。这避免了浮点数比较问题,是整数范围内判断完全平方数的常用方法。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 下面的C++代码用于实现如下图所示的效果,应在以下右图C++代码中填入()。
(效果图展示每行数字递增,并在行尾换行)
cpp
// 目标效果
0
01
012
0123
...
// 代码
cin >> N;
for(int i = 0; i < N; i++) {
int nowNum = 0;
for (int j = 0; j < i + 1; j++) {
cout << nowNum; // 实际输出的不是nowNum,而是j
// nowNum += j; // 题目逻辑混乱
// if (nowNum >= 10) nowNum = 0;
}
// 此处需要换行
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A. 与第8行下面填入一行:cout << nowNum; B. 与第2行下面填入一行: cout << endl; C. 与第7行下面填入一行: cout << nowNum; D. 与第9行下面填入一行: cout << endl;
查看解析
答案:D
考纲知识点: 循环嵌套、格式化输出
解析: 代码的意图是打印一个数字金字塔。外层循环控制行数,内层循环控制每一行打印的内容。内层循环结束后,意味着一行已经打印完毕,此时需要输出一个换行符 endl 来另起一行。这个换行操作应该在内层循环for(int j=...){...}之后,外层循环for(int i=...){...}之内。根据题目给的行号(虽然不清晰),D选项的位置是在内循环之后,是正确的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 某公司新出了一款无人驾驶的小汽车,通过声控智能驾驶系统,乘客只要告诉汽车目的地,车子就能自动选择一条优化路线,告诉乘客后驶达那里。请问下面哪项不是驾驶系统完成选路所必须的。()
A. 麦克风 B. 扬声器 C. 油量表 D. 传感器
查看解析
答案:C
考纲知识点: 计算机应用
解析:
- 麦克风:用于接收乘客的语音指令(声控),必须。
- 扬声器:用于告诉乘客路线信息,必须。
- 传感器:用于感知周围环境(如其他车辆、障碍物、交通信号灯),是无人驾驶的核心,必须。
- 油量表:用于显示剩余油量。虽然对驾驶很重要,但对于“选择路线”这个核心算法功能来说,它不是必须的输入信息。路线规划主要依赖地图数据、交通状况和目的地。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 现代计算机是指电子计算机,它所基于的是()体系结构。
A. 艾伦·图灵 B. 冯·诺依曼 C. 阿塔纳索夫 D. 埃克特-莫克利
查看解析
答案:B
考纲知识点: 计算机历史
解析: 现代通用计算机的设计思想都遵循冯·诺依曼体系结构。其核心思想是“存储程序控制”,即将程序指令和数据一同存放在存储器中,计算机可以自动执行指令。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 输入一个正整数N,想找出它所有相邻的因数对,比如,输入12,因数对有(1,2)、(2,3)、(3,4)。下面哪段代码找不到所有的因数对?()
A. for(i=1; i<N; i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1); B. for(i=2; i<N; i++) if(!(N%i) && !(N%(i-1))) printf("(%d,%d)\n", i-1, i); C. for(i=2; i<N/2; i++) if(!(N%(i-1)) && !(N%i)) printf("(%d,%d)\n", i-1, i); D. for(i=1; i<N/2; i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1);
查看解析
答案:B
解析: 这道题的答案B是官方给出的,但经过分析,B选项 for(i=2; i<N; i++) if(!(N%i) && !(N%(i-1))) printf("(%d,%d)\n", i-1, i); 实际上是能找到所有因数对的,它检查i和i-1。 A选项能找到所有因数对。 C和D选项的循环范围是 i<N/2,这会导致漏掉一些情况。例如N=30,相邻因数对有(1,2), (2,3), (5,6)。当检查(5,6)时,i=5,i<N/2即5<15成立。但如果N=12,(3,4)可以找到。如果N=42, (6,7)是因数对, i=6, i<21成立。但如果N=182=13*14,i=13时,i<91成立。如果N=12,(3,4),i=3, i<6成立。看来N/2不一定会导致错误。
让我们重新审视B。for(i=2; i<N; i++)检查i-1和i。当i=2时,检查1和2。当i=N时,检查N-1和N。这个逻辑似乎是正确的。
让我们再看A。for(i=1; i<N; i++)检查i和i+1。当i=1时,检查1和2。当i=N-1时,检查N-1和N。这个逻辑也是正确的。
这道题的选项和答案非常可疑,可能存在错误。如果必须选一个,需要找到一个明确的逻辑漏洞。但根据表面逻辑,A和B似乎都是正确的,而C和D的N/2限制是可疑点。然而答案是B,这里只能按答案来解释,可能存在我们没考虑到的特殊测试用例。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题 (每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | √ | × | × | × | × | × | × | √ | × | × |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. C++表达式-7/2的值为整数-3.。
查看解析
答案:√
考纲知识点: 基本运算
解析: C++中两个整数相除,结果是整型除法,即舍弃小数部分。-7 / 2 的数学结果是-3.5,舍弃小数部分后得到-3。叙述正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. C++表达式2 * int('9') * 2的值为36.。
查看解析
答案:×
考纲知识点: ASCII码、类型转换
解析: int('9') 会将字符'9'转换为其对应的ASCII码值,即57。所以表达式变为 2 * 57 * 2,结果是228,而不是36。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. C++表达式3+2 && 5-5的值为false.。
查看解析
答案:×
考纲知识点: 逻辑运算
解析: && 是逻辑与运算符。3+2 结果是5,非零,视为true。5-5结果是0,视为false。true && false 的结果是false。所以表达式的值为false。题干的叙述是正确的,但是答案给的是×,这说明可能题目问的是表达式的值是否为true,或者答案本身有误。如果按照“表达式的值为false”来判断,叙述是正确的。但按官方答案为×,则叙述为错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 在C++代码中,执行srand(0)后连续两次执行rand()的结果相等.。
查看解析
答案:×
考纲知识点: 标准库函数
解析: srand()用于设置随机数种子。只要种子相同,rand()生成的随机数序列就是相同的。但“连续两次”执行rand(),得到的是序列中的第一个和第二个随机数,它们通常是不同的。叙述错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. C++代码中while(1){...}的判断条件不是逻辑值,将导致语法错误.。
查看解析
答案:×
考纲知识点: 循环结构
解析: 在C++中,非零整数可以隐式转换为bool类型的true。所以while(1)是合法的,等价于while(true),会形成一个无限循环。这不会导致语法错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 执行以下C++代码后将输出0.。
cpp
int Sum = 0;
for (int i = -500; i < 500; i++) {
Sum += i;
}
cout << Sum;1
2
3
4
5
2
3
4
5
查看解析
答案:×
考纲知识点: 循环结构
解析: 循环累加的范围是 [-500, 499]。其中 [-499, 499] 这部分的正负数会相互抵消,和为0。但最后还剩下一个-500没有被抵消。所以最终Sum的值是-500,而不是0。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 在C++代码中,运算符只能处理相同的数据类型,不同类型之间必须转换为相同的数据类型.。
查看解析
答案:×
考纲知识点: 数据类型转换
解析: C++有强大的隐式类型转换规则。当不同类型的变量进行运算时,编译器会自动将较低精度的类型提升为较高精度的类型,然后再进行计算。例如 int 和 double 运算,int 会被自动转为 double。所以不一定需要程序员手动转换。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 在C++代码中,虽然变量都有数据类型,但同一个变量也可以先后用不同类型的值赋值.。
查看解析
答案:√
考纲知识点: 数据类型转换、赋值语句
解析: 这是可以的,但会发生隐式类型转换。例如,可以把一个double值赋给一个int变量,但小数部分会被丢弃。例如 int a; a = 3.14; 是合法的,执行后a的值是3。变量本身的类型不会改变,但赋给它的值会被转换。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 小杨最近在准备考GESP,他用的DevC++来练习和运行程序,所以DevC++也是一个小型操作系统.。
查看解析
答案:×
考纲知识点: 软件与硬件
解析: Dev-C++是一个集成开发环境(IDE),它提供了代码编辑器、编译器、调试器等工具,方便程序员开发软件。它本身是一个应用程序,需要运行在操作系统(如Windows)之上,它不是操作系统。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 任何一个while循环都可以转化为等价的for循环.。
查看解析
答案:√
考纲知识点: 循环结构
解析: 理论上是的。while循环的初始化部分可以放在for的初始化部分;while的条件可以放在for的条件部分;while循环体中用于改变循环变量的语句可以放在for的迭代表达式部分。所以它们在功能上是等价的。叙述正确,但答案给的是×,这可能是因为在某些极端或复杂的循环场景下,转换会非常不自然或困难,但从基本语法结构上来说,两者是可互换的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题 (每题25分,共50分)
1. 小杨做题
问题描述
为了准备考试,小杨每天都要做题。第1天,小杨做了a道题;第2天,小杨做了b道题;从第3天起,小杨每天做的题目数量是前两天的总和。此外,小杨还规定,当自己某一天做了大于或等于m题时,接下来的所有日子里,他就再也不做题了。请问,到了第N天,小杨总共做了多少题呢?
输入格式
总共4行。第一行一个整数a,第二行一个整数b,第三行一个整数m,第四行一个整数N。 约定 0 <= a,b < M <= 1,000,000,3 <= N <= 364。
输出格式
一行一个整数,表示小杨N天里总共做了多少题目。
样例输入1
1
2
10
51
2
3
4
2
3
4
样例输出1
191
解题思路
查看解题思路
题目大意: 这是一个斐波那契数列的变种,带有停止条件和求和。
考纲知识点: 循环结构、模拟。
解题步骤:
- 初始化:读取输入的
a,b,m,N。定义一个总和变量totalSum,并初始化为a + b。 - 特殊情况:需要先判断第一天或第二天是否就超过了
m。根据题意a, b < m,所以前两天不会停止。 - 循环模拟:用一个
for循环从第3天模拟到第N天。- 在循环中,计算今天的题量
currentDay = a + b。 - 停止条件:判断
currentDay是否大于或等于m。如果是,则用break立刻跳出循环,不再做题。 - 累加:如果没停止,将
currentDay加到totalSum中。 - 更新:为下一次循环做准备,更新前两天的题量:
a = b; b = currentDay;。
- 在循环中,计算今天的题量
- 输出:循环结束后,输出
totalSum。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
using namespace std;
int main() {
long long a, b, m, n;
cin >> a >> b >> m >> n;
long long totalSum = 0;
if (n >= 1) {
if (a >= m) {
cout << 0 << endl;
return 0;
}
totalSum += a;
}
if (n >= 2) {
if (b >= m) {
cout << totalSum << endl;
return 0;
}
totalSum += b;
}
for (int i = 3; i <= n; i++) {
long long currentDay = a + b;
if (currentDay >= m) {
break;
}
totalSum += currentDay;
a = b;
b = currentDay;
}
cout << totalSum << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 小杨的H字矩阵
问题描述
小杨想要构造一个N x N的H字矩阵(N为奇数),具体来说,这个矩阵共有N行,每行N个字符,其中最左列、最右列都是|,而中间一行(即第(N+1)/2行)的第2 ~ N-1个字符都是-,其余所有字符都是半角小写字母a。例如,一个N=5的H字矩阵如下:
|aaa|
|aaa|
|---|
|aaa|
|aaa|1
2
3
4
5
2
3
4
5
请你帮小杨根据给定的N打印出对应的“H字矩阵”。
输入格式
一行一个整数N (5 <= N <= 49,保证N为奇数)。
输出格式
输出对应的“H字矩阵”。
样例输入1
51
样例输出1
|aaa|
|aaa|
|---|
|aaa|
|aaa|1
2
3
4
5
2
3
4
5
解题思路
查看解题思路
题目大意: 根据规则打印一个N*N的字符矩阵。
考纲知识点: 循环嵌套、条件判断。
解题步骤:
- 读取N:首先读取输入的奇数N。
- 确定中间行:计算出中间行的行号
mid_row = (N + 1) / 2。 - 双重循环:使用两层嵌套的
for循环来遍历矩阵的每一个位置。外层循环变量i代表行号(从1到N),内层循环变量j代表列号(从1到N)。 - 条件判断:在内层循环中,对每个坐标
(i, j)进行判断,确定应该打印哪个字符。- 如果
j == 1或j == N(第一列或最后一列),则打印|。 - 如果
i == mid_row(中间行),则打印-。 - 如果以上条件都不满足,则打印
a。
- 如果
- 换行:每当内层循环(打印完一行)结束后,需要打印一个换行符
endl,以便开始新的一行。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int mid_row = (n + 1) / 2;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (j == 1 || j == n) {
cout << "|";
} else if (i == mid_row) {
cout << "-";
} else {
cout << "a";
}
}
cout << endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限